{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 数据已经准备好了，都是特征工程编码后的数据（RentListingInquries_FE_train.csv）或稀疏编码的形式（RentListingInquries_FE_train.bin）。xgboost既可以单独调用，也可以在sklearn框架下调用。若采用xgboost单独调用使用方式，建议读取稀疏格式文件。\n",
    "独立调用xgboost或在sklearn框架下调用均可。  \n",
    "1. 模型训练：超参数调优  \n",
    "    a) 初步确定弱学习器数目：   \n",
    "    b) 对树的最大深度（可选）和min_children_weight进行调优（可选）：  \n",
    "    c) 对正则参数进行调优：  \n",
    "    d) 重新调整弱学习器数目：  \n",
    "    e) 行列重采样参数调整：  \n",
    "2. 调用模型进行测试  \n",
    "3. 生成测试结果文件  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先导入必要的模块"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train = pd.read_csv(\"./data/RentListingInquries_FE_train.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2be040c7748>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.countplot(train.interest_level);\n",
    "pyplot.xlabel('interest_level');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# drop ids and get labels\n",
    "y_train = train['interest_level']\n",
    "# y_train = y_train.map(lambda s: s[6:])\n",
    "# y_train = y_train.map(lambda s: int(s)-1)\n",
    "\n",
    "train = train.drop(['interest_level'], axis=1)\n",
    "X_train = np.array(train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "#直接调用xgboost内嵌的交叉验证（cv），可对连续的n_estimators参数进行快速交叉验证\n",
    "#而GridSearchCV只能对有限个参数进行交叉验证\n",
    "def modelfit(alg, X_train, y_train, cv_folds=None, early_stopping_rounds=50):\n",
    "    xgb_param = alg.get_xgb_params()\n",
    "    xgb_param['num_class'] = 3\n",
    "    \n",
    "    #直接调用xgboost，而非sklarn的wrapper类\n",
    "    xgtrain = xgb.DMatrix(X_train, label = y_train)\n",
    "        \n",
    "    cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], folds =cv_folds,\n",
    "             metrics='mlogloss', early_stopping_rounds=early_stopping_rounds)\n",
    "  \n",
    "    cvresult.to_csv('1_nestimators.csv', index_label = 'n_estimators')\n",
    "    \n",
    "    #最佳参数n_estimators\n",
    "    n_estimators = cvresult.shape[0]\n",
    "    print(\"the best n_estimators is :\", n_estimators)\n",
    "    \n",
    "    # 采用交叉验证得到的最佳参数n_estimators，训练模型\n",
    "    alg.set_params(n_estimators = n_estimators)\n",
    "    alg.fit(X_train[:40000], y_train[:40000], eval_metric='mlogloss')\n",
    "        \n",
    "    #Predict training set:\n",
    "    train_predprob = alg.predict_proba(X_train[:40000])\n",
    "    logloss_train = log_loss(y_train[:40000], train_predprob)\n",
    "    val_predprob = alg.predict_proba(X_train[40000:])\n",
    "    logloss_val = log_loss(y_train[40000:], val_predprob)\n",
    "   #Print model report:\n",
    "    print(\"logloss of train :\",logloss_train )\n",
    "    print(\"logloss of validation :\",logloss_val )\n",
    "#    print logloss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "the best n_estimators is : 286\n",
      "logloss of train : 0.502178639469\n",
      "logloss of validation : 0.511947983734\n"
     ]
    }
   ],
   "source": [
    "#params = {\"objective\": \"multi:softprob\", \"eval_metric\":\"mlogloss\", \"num_class\": 9}\n",
    "xgb1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=1000,  #数值大没关系，cv会自动返回合适的n_estimators\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "modelfit(xgb1, X_train, y_train, cv_folds = kfold)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 这里我们得出的最佳的n_estimators的数目是286"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2be09b36da0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "        \n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(0, cvresult.shape[0])\n",
    "        \n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators4_1.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nNXXq1KmMGTOm2cORJEmS1CTTpk1j7NixAGNTStN6e5z3LEmSJElSnZloSZIkSVKdmWhJkiRJUp2Z\naEmSJElSnZloSZIkSVKdmWhJkiRJUp2ZaEmSJElSnZloSZIkSVKdmWhJkiRJUp2ZaEmSJElSnZlo\nSZIkSVKdmWhJkiRJUp2ZaEmSJElSnZloSZIkSVKdmWhJkiRJUp2ZaEmSJElSnZloSZIkSVKdmWhJ\nkiRJUp2ZaEmSJElSnZloSZIkSVKdmWhJkiRJUp2ZaEmSJElSnZloSZIkSVKdmWhJkiRJUp2ZaEmS\nJElSnZloSZIkSVKdmWhJkiRJUp2NaPYABrNp06Y1ewiSJEmSmqi/OUGklOo8lNYXEcsBLzR7HJIk\nSZIGjeVTSv/qbWcTrS5ERADjgLebPRZgUYqkb3kGx3jajde/ebz2zeO1bx6vffN47ZvL6988Xvve\nWRSYkvqQPDl1sAulC9jrbHUgFTkfAG+nlJzL2GBe/+bx2jeP1755vPbN47VvLq9/83jte63P18bF\nMCRJkiSpzky0JEmSJKnOTLQGv1nAT0p/qvG8/s3jtW8er33zeO2bx2vfXF7/5vHaDxAXw5AkSZKk\nOrOiJUmSJEl1ZqIlSZIkSXVmoiVJkiRJdWaiJUmSJEl1ZqLVJBGxWURcGhFTIiJFxGeq9kdEHFHa\n/25E3BgRa1T1WTwiJkfE1NJrckQs1th30npqXfuIWCAifhERf4+I6aU+Z0fEuKpzPFM6tvz188a/\nm9bSi8/9mV1c1zuq+iwYEcdFxGul/0aXRMTyjX0nracX1776une+/r2sj5/7foiIQyPi7oh4OyJe\niYiLI2K1qj49fq4jYnzpv+H0Ur9jI2JkY99Na+np2kfE+0rX/fGImBERz5Wu69iq83T1/8ZXG/+O\nWkcvP/c3dnFd/1DVx991+qEXn/2Vavzc372sn5/9+WCi1TyLAA8CX+9m//eA75T2rwu8BFwTEYuW\n9TkPWAvYvvRaC5g8UAMeQmpd+1HAOsBPS3/uBnwIuKSLvj8Gli17/ddADHaI6elzD3Alldd1h6r9\nxwC7AnsBmwCjgcsiYnjdRzu09HTtl6167Q8k4E9V/fzc993mwAnABsC2wAjg6ohYpKxPzc916c/L\nKf47blLq91ng1w16D62qp2s/rvT6N+BjwESKf09P7+Jc+1H52T9rIAc+BPTmcw9wKpXX9aCq/f6u\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2be09b36fd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "\n",
    "cvresult = cvresult.iloc[100:]\n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(100,cvresult.shape[0]+100)\n",
    "        \n",
    "fig = pyplot.figure(figsize=(10, 10), dpi=100)\n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "# pyplot.savefig( 'n_estimators_detail.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "def modelfit2(alg, dtrain, predictors,useTrainCV=True, cv_folds=5, early_stopping_rounds=50):\n",
    "    if useTrainCV:\n",
    "        xgb_param = alg.get_xgb_params()\n",
    "        xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target].values)\n",
    "        cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,\n",
    "            metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False)\n",
    "        alg.set_params(n_estimators=cvresult.shape[0])\n",
    "\n",
    "    #Fit the algorithm on the data\n",
    "    alg.fit(dtrain[predictors], dtrain['Disbursed'],eval_metric='auc')\n",
    "\n",
    "    #Predict training set:\n",
    "    dtrain_predictions = alg.predict(dtrain[predictors])\n",
    "    dtrain_predprob = alg.predict_proba(dtrain[predictors])[:,1]\n",
    "\n",
    "    #Print model report:\n",
    "    print(\"\\nModel Report\")\n",
    "    print(\"Accuracy : %.4g\" % metrics.accuracy_score(dtrain['Disbursed'].values, dtrain_predictions))\n",
    "    print(\"AUC Score (Train): %f\" % metrics.roc_auc_score(dtrain['Disbursed'], dtrain_predprob))\n",
    "\n",
    "    feat_imp = pd.Series(alg.booster().get_fscore()).sort_values(ascending=False)\n",
    "    feat_imp.plot(kind='bar', title='Feature Importances')\n",
    "    plt.ylabel('Feature Importance Score')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': range(3, 10, 2), 'min_child_weight': range(1, 6, 2)}"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max_depth = range(3,10,2)\n",
    "min_child_weight = range(1,6,2)\n",
    "param_test2_1 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 使用网格搜索来寻找相对比较合适的max_depth和min_child_weight"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gsearch2_1.grid_scores_: [mean: -0.59801, std: 0.00285, params: {'max_depth': 3, 'min_child_weight': 1}, mean: -0.59825, std: 0.00291, params: {'max_depth': 3, 'min_child_weight': 3}, mean: -0.59833, std: 0.00310, params: {'max_depth': 3, 'min_child_weight': 5}, mean: -0.58752, std: 0.00409, params: {'max_depth': 5, 'min_child_weight': 1}, mean: -0.58829, std: 0.00424, params: {'max_depth': 5, 'min_child_weight': 3}, mean: -0.58814, std: 0.00354, params: {'max_depth': 5, 'min_child_weight': 5}, mean: -0.59232, std: 0.00337, params: {'max_depth': 7, 'min_child_weight': 1}, mean: -0.59171, std: 0.00402, params: {'max_depth': 7, 'min_child_weight': 3}, mean: -0.59066, std: 0.00461, params: {'max_depth': 7, 'min_child_weight': 5}, mean: -0.61285, std: 0.00351, params: {'max_depth': 9, 'min_child_weight': 1}, mean: -0.60631, std: 0.00521, params: {'max_depth': 9, 'min_child_weight': 3}, mean: -0.60146, std: 0.00335, params: {'max_depth': 9, 'min_child_weight': 5}]\n",
      "best_params: {'max_depth': 5, 'min_child_weight': 1}\n",
      "best_score: -0.587524661154\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "xgb2_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=286,  #第一轮参数调整得到的n_estimators最优值\n",
    "#         max_depth=5,\n",
    "#         min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch2_1 = GridSearchCV(xgb2_1, param_grid = param_test2_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2_1.fit(X_train , y_train)\n",
    "\n",
    "print(\"gsearch2_1.grid_scores_:\",gsearch2_1.grid_scores_)\n",
    "print(\"best_params:\",gsearch2_1.best_params_)\n",
    "print(\"best_score:\",gsearch2_1.best_score_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以图例的方式来展现，看看效果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.587525 using {'max_depth': 5, 'min_child_weight': 1}\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAELCAYAAADz6wBxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3Xl8FeXd///X52zZwxp2kEVQFDBC\niFQEgQoGF5RqVaze6u3Saq319taitRVRa/Xu72vdqHWpWq371qKFsFgUxWoACxaxCipq2PdsZD2f\n3x8zOZyELCc5OTlJ+Dwfj/PIOTPXzFxnIPPOXDNzXaKqGGOMMc3liXcFjDHGtG8WJMYYY6JiQWKM\nMSYqFiTGGGOiYkFijDEmKhYkxhhjomJBYowxJioWJMYYY6JiQWKMMSYqvnhXoDV0795dBw4cGO9q\nGGNMu7J69epdqprRWLnDIkgGDhzIqlWr4l0NY4xpV0Tkm0jKWdOWMcaYqFiQGGOMiYoFiTHGmKgc\nFtdIjDGRq6ioID8/n9LS0nhXxbSSxMRE+vXrh9/vb9byFiTGmBry8/NJS0tj4MCBiEi8q2NiTFXZ\nvXs3+fn5DBo0qFnrsKYtY0wNpaWldOvWzULkMCEidOvWLaozUAsSY8whLEQOL9H+e1vTVgMKly0D\nVVJOOglPIBDv6hhjTJtkQdKAPU89TUleHp7UVNK+P4W0nBxSxo+3UDHGmDDWtNWAAX96gv6PP07a\nqdMofOdd8q++hg3jT2LLzbdQ9O67aHl5vKtoTIezb98+/vCHPzRr2fvvv5+SkpIWrlHLmDRpUrN7\n2PjrX//K+vXrm7Su0tJSsrOzOe644zj22GOZM2dOs7YdCQuSBojfT+qEk+jzm98w7L3l9H/sUdJO\nOYXCt9/mux//hC9OmsCWX95K0XvvoRUV8a6uMR1CRw2SaNQOkkgkJCTwj3/8g7Vr17JmzRpyc3P5\n8MMPY1I/a9qKkAQCpE6cSOrEiejc2yn64AMKF+ZSuGQJ+19/HU+nTqSd8n3Sc6aTMu4EpJn3YxvT\nlsx981PWbylo0XUe0yedOWceW+/8m2++mS+//JLMzEymTp1Kjx49ePnllykrK2PmzJnMnTuX4uJi\nzjvvPPLz86mqquLXv/4127dvZ8uWLUyePJnu3buzbNmyOtefmprKT3/6U5YuXUqXLl24++67+cUv\n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\nWPfW71WHOHoAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x2be09e9bb70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(\"Best: %f using %s\" % (gsearch2_1.best_score_, gsearch2_1.best_params_))\n",
    "test_means = gsearch2_1.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_1.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_1.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_1.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2_1.cv_results_).to_csv('my_preds_maxdepth_min_child_weights2_1.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(max_depth), len(min_child_weight))\n",
    "train_scores = np.array(train_means).reshape(len(max_depth), len(min_child_weight))\n",
    "\n",
    "for i, value in enumerate(max_depth):\n",
    "    pyplot.plot(min_child_weight, -test_scores[i], label= 'test_max_depth:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig('max_depth_vs_min_child_weght_1.png' )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来再进行一些精细的调整，对max_depth和min_child_weight调整"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': [4, 5, 6], 'min_child_weight': [0.5, 1, 1.5]}"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "max_depth = [4,5,6]\n",
    "min_child_weight = [0.5,1,1.5]\n",
    "param_test2_2 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gsearch2_2.grid_scores_: [mean: -0.59040, std: 0.00331, params: {'max_depth': 4, 'min_child_weight': 1}, mean: -0.59055, std: 0.00372, params: {'max_depth': 4, 'min_child_weight': 2}, mean: -0.58752, std: 0.00409, params: {'max_depth': 5, 'min_child_weight': 1}, mean: -0.58829, std: 0.00304, params: {'max_depth': 5, 'min_child_weight': 2}, mean: -0.58978, std: 0.00308, params: {'max_depth': 6, 'min_child_weight': 1}, mean: -0.58964, std: 0.00437, params: {'max_depth': 6, 'min_child_weight': 2}]\n",
      "best_params: {'max_depth': 5, 'min_child_weight': 1}\n",
      "best_score: -0.587524661154\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "xgb2_2 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=286,  #第一轮参数调整得到的n_estimators最优值\n",
    "#         max_depth=5,\n",
    "#         min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch2_2 = GridSearchCV(xgb2_2, param_grid = param_test2_2, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2_2.fit(X_train , y_train)\n",
    "\n",
    "print(\"gsearch2_2.grid_scores_:\",gsearch2_2.grid_scores_)\n",
    "print(\"best_params:\",gsearch2_2.best_params_)\n",
    "print(\"best_score:\",gsearch2_2.best_score_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "经过精细的调整max_depth和min_child_weight，我们发现网格搜索的最后返回给我们的还是{'max_depth': 5, 'min_child_weight': 1}这一组参数最好。所以，我们就可以直接用这组参数调整其他的参数了。**再返回来重新调优弱分类器的数目**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "def modelfit2(alg, X_train, y_train, useTrainCV=True, cv_folds=None, early_stop_rounds=50):\n",
    "    if useTrainCV:\n",
    "        xgb_param = alg.get_xgb_params()\n",
    "        xgb_param['num_class'] = 3\n",
    "        \n",
    "        xgtrain = xgb.DMatrix(X_train,label=y_train)\n",
    "        \n",
    "        cv_result = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_xgb_params()['n_estimators'], folds=cv_folds, \n",
    "                           metrics='mlogloss', early_stopping_rounds=early_stop_rounds)\n",
    "        n_estimators = cv_result.shape[0]\n",
    "        alg.set_params(n_estimators = n_estimators)\n",
    "        print(\"the best n_estimators is :\", n_estimators)\n",
    "        \n",
    "#         print(cvresult)\n",
    "        #result = pd.DataFrame(cvresult)   #cv缺省返回结果为DataFrame\n",
    "        #result.to_csv('my_preds.csv', index_label = 'n_estimators')\n",
    "        cvresult.to_csv('n_estimators2_3.csv', index_label = 'n_estimators')\n",
    "        \n",
    "        # plot\n",
    "#         test_means = cvresult['test-mlogloss-mean']\n",
    "#         test_stds = cvresult['test-mlogloss-std'] \n",
    "    \n",
    "#         train_means = cvresult['train-mlogloss-mean']\n",
    "#         train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "#         x_axis = range(0, n_estimators)\n",
    "#         pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "#         pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "#         pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "#         pyplot.xlabel( 'n_estimators' )\n",
    "#         pyplot.ylabel( 'Log Loss' )\n",
    "#         pyplot.savefig( 'n_estimators4_2_3_699.png' )\n",
    "        \n",
    "    alg.set_params(n_estimators = n_estimators)\n",
    "    alg.fit(X_train[:40000], y_train[:40000], eval_metric='mlogloss')\n",
    "        \n",
    "    #Predict training set:\n",
    "    train_predprob = alg.predict_proba(X_train[:40000])\n",
    "    logloss_train = log_loss(y_train[:40000], train_predprob)\n",
    "    val_predprob = alg.predict_proba(X_train[40000:])\n",
    "    logloss_val = log_loss(y_train[40000:], val_predprob)\n",
    "   #Print model report:\n",
    "    print(\"logloss of train :\",logloss_train )\n",
    "    print(\"logloss of validation :\",logloss_val )\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "the best n_estimators is : 286\n",
      "logloss of train : 0.491037152664\n",
      "logloss of validation : 0.598707154321\n"
     ]
    }
   ],
   "source": [
    "xgb2_3 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=1000,  #数值大没关系，cv会自动返回合适的n_estimators\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "modelfit2(xgb2_3, X_train, y_train, cv_folds = kfold)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 下面开始网格搜索行重采样colsample_bytree，列重采样subsample这两个参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'colsample_bytree': [0.6, 0.7, 0.8, 0.9],\n",
       " 'subsample': [0.5, 0.6, 0.7, 0.8, 0.9]}"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "subsample = [i/10.0 for i in range(5,10)]\n",
    "colsample_bytree = [i/10.0 for i in range(6,10)]\n",
    "param_test3_1 = dict(subsample=subsample, colsample_bytree=colsample_bytree)\n",
    "param_test3_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gsearch3_1.grid_scores_: [mean: -0.58438, std: 0.00315, params: {'colsample_bytree': 0.6, 'subsample': 0.5}, mean: -0.58378, std: 0.00342, params: {'colsample_bytree': 0.6, 'subsample': 0.6}, mean: -0.58291, std: 0.00350, params: {'colsample_bytree': 0.6, 'subsample': 0.7}, mean: -0.58206, std: 0.00303, params: {'colsample_bytree': 0.6, 'subsample': 0.8}, mean: -0.58284, std: 0.00402, params: {'colsample_bytree': 0.6, 'subsample': 0.9}, mean: -0.58424, std: 0.00413, params: {'colsample_bytree': 0.7, 'subsample': 0.5}, mean: -0.58369, std: 0.00427, params: {'colsample_bytree': 0.7, 'subsample': 0.6}, mean: -0.58280, std: 0.00399, params: {'colsample_bytree': 0.7, 'subsample': 0.7}, mean: -0.58252, std: 0.00416, params: {'colsample_bytree': 0.7, 'subsample': 0.8}, mean: -0.58302, std: 0.00372, params: {'colsample_bytree': 0.7, 'subsample': 0.9}, mean: -0.58469, std: 0.00386, params: {'colsample_bytree': 0.8, 'subsample': 0.5}, mean: -0.58378, std: 0.00374, params: {'colsample_bytree': 0.8, 'subsample': 0.6}, mean: -0.58279, std: 0.00360, params: {'colsample_bytree': 0.8, 'subsample': 0.7}, mean: -0.58220, std: 0.00334, params: {'colsample_bytree': 0.8, 'subsample': 0.8}, mean: -0.58240, std: 0.00373, params: {'colsample_bytree': 0.8, 'subsample': 0.9}, mean: -0.58382, std: 0.00350, params: {'colsample_bytree': 0.9, 'subsample': 0.5}, mean: -0.58306, std: 0.00399, params: {'colsample_bytree': 0.9, 'subsample': 0.6}, mean: -0.58189, std: 0.00377, params: {'colsample_bytree': 0.9, 'subsample': 0.7}, mean: -0.58199, std: 0.00391, params: {'colsample_bytree': 0.9, 'subsample': 0.8}, mean: -0.58233, std: 0.00348, params: {'colsample_bytree': 0.9, 'subsample': 0.9}]\n",
      "best_params: {'colsample_bytree': 0.9, 'subsample': 0.7}\n",
      "best_score: -0.581889270025\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "xgb3_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=286,  #第二轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch3_1 = GridSearchCV(xgb3_1, param_grid = param_test3_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch3_1.fit(X_train , y_train)\n",
    "\n",
    "print(\"gsearch3_1.grid_scores_:\",gsearch3_1.grid_scores_)\n",
    "print(\"best_params:\",gsearch3_1.best_params_)\n",
    "print(\"best_score:\",gsearch3_1.best_score_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里我们找出来最好的参数分别是colsample_bytree: 0.9 以及 subsample: 0.7。但是因为colsample_bytree是在边界，所以我们可以继续对它进行调优，看看是否有更合适的参数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'colsample_bytree': [0.9, 1.0], 'subsample': [0.7]}"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "subsample = [0.7]\n",
    "colsample_bytree = [0.9, 1.0]  #因为取值在0到1之间\n",
    "param_test3_2 = dict(subsample=subsample, colsample_bytree=colsample_bytree)\n",
    "param_test3_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gsearch3_2.grid_scores_: [mean: -0.58189, std: 0.00377, params: {'colsample_bytree': 0.9, 'subsample': 0.7}, mean: -0.58220, std: 0.00439, params: {'colsample_bytree': 1.0, 'subsample': 0.7}]\n",
      "best_params: {'colsample_bytree': 0.9, 'subsample': 0.7}\n",
      "best_score: -0.581889270025\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "xgb3_2 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=286,  #第二轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.7,\n",
    "        colsample_bytree=0.9,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch3_2 = GridSearchCV(xgb3_2, param_grid = param_test3_2, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch3_2.fit(X_train , y_train)\n",
    "\n",
    "print(\"gsearch3_2.grid_scores_:\",gsearch3_2.grid_scores_)\n",
    "print(\"best_params:\",gsearch3_2.best_params_)\n",
    "print(\"best_score:\",gsearch3_2.best_score_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "OK，那我们最终所确定的行列重采样参数就是colsample_bytree: 0.9, subsample: 0.7了\n",
    "#### 接下来调优正则参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'reg_alpha': [0.5, 1, 2], 'reg_lambda': [0.5, 1, 2]}"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#reg_alpha = [1e-3, 1e-2, 0.05, 0.1]    #default = 0\n",
    "#reg_lambda = [1e-3, 1e-2, 0.05, 0.1]   #default = 1\n",
    "\n",
    "reg_alpha = [ 0.5, 1, 2]    #default = 0, 测试0.5, 1，2\n",
    "reg_lambda = [0.5, 1, 2]      #default = 1，测试0.1， 0.5， 1，2\n",
    "\n",
    "param_test5_1 = dict(reg_alpha=reg_alpha, reg_lambda=reg_lambda)\n",
    "param_test5_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gsearch5_1.grid_scores_: [mean: -0.58203, std: 0.00377, params: {'reg_alpha': 0.5, 'reg_lambda': 0.5}, mean: -0.58224, std: 0.00369, params: {'reg_alpha': 0.5, 'reg_lambda': 1}, mean: -0.58262, std: 0.00362, params: {'reg_alpha': 0.5, 'reg_lambda': 2}, mean: -0.58154, std: 0.00382, params: {'reg_alpha': 1, 'reg_lambda': 0.5}, mean: -0.58221, std: 0.00380, params: {'reg_alpha': 1, 'reg_lambda': 1}, mean: -0.58197, std: 0.00361, params: {'reg_alpha': 1, 'reg_lambda': 2}, mean: -0.58185, std: 0.00355, params: {'reg_alpha': 2, 'reg_lambda': 0.5}, mean: -0.58187, std: 0.00388, params: {'reg_alpha': 2, 'reg_lambda': 1}, mean: -0.58243, std: 0.00334, params: {'reg_alpha': 2, 'reg_lambda': 2}]\n",
      "best_params: {'reg_alpha': 1, 'reg_lambda': 0.5}\n",
      "best_score: -0.581539789612\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "xgb5_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=286,  #第二轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.7,\n",
    "        colsample_bytree=0.9,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch5_1 = GridSearchCV(xgb5_1, param_grid = param_test5_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch5_1.fit(X_train , y_train)\n",
    "\n",
    "print(\"gsearch5_1.grid_scores_:\",gsearch5_1.grid_scores_)\n",
    "print(\"best_params:\",gsearch5_1.best_params_)\n",
    "print(\"best_score:\",gsearch5_1.best_score_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再精细的找正则参数lambda"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'reg_alpha': [1], 'reg_lambda': [0.4, 0.5, 0.6]}"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg_alpha = [1]    #default = 0, 测试0.5, 1，2\n",
    "reg_lambda = [0.4, 0.5, 0.6]      #default = 1，测试0.1， 0.5， 1，2\n",
    "\n",
    "param_test5_2 = dict(reg_alpha=reg_alpha, reg_lambda=reg_lambda)\n",
    "param_test5_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "gsearch5_2.grid_scores_: [mean: -0.58245, std: 0.00391, params: {'reg_alpha': 1, 'reg_lambda': 0.4}, mean: -0.58154, std: 0.00382, params: {'reg_alpha': 1, 'reg_lambda': 0.5}, mean: -0.58224, std: 0.00355, params: {'reg_alpha': 1, 'reg_lambda': 0.6}]\n",
      "best_params: {'reg_alpha': 1, 'reg_lambda': 0.5}\n",
      "best_score: -0.581539789612\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "xgb5_2 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=286,  #第二轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.7,\n",
    "        colsample_bytree=0.9,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch5_2 = GridSearchCV(xgb5_2, param_grid = param_test5_2, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch5_2.fit(X_train , y_train)\n",
    "\n",
    "print(\"gsearch5_2.grid_scores_:\",gsearch5_2.grid_scores_)\n",
    "print(\"best_params:\",gsearch5_2.best_params_)\n",
    "print(\"best_score:\",gsearch5_2.best_score_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 下面用最终的参数生成一个模型，然后对其进行训练，用前面39000条数据进行训练，剩下10000多条进行测试来看模型怎么样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of train : 0.478646218063\n",
      "logloss of validation : 0.584261351903\n"
     ]
    }
   ],
   "source": [
    "xgb_final =  XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=286,  \n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.7,\n",
    "        colsample_bytree=0.9,\n",
    "        reg_alpha=1,\n",
    "        reg_lambda=0.5,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train, random_state=42, test_size=0.25)\n",
    "\n",
    "xgb_final.fit(X_tr,y_tr,eval_metric='mlogloss')\n",
    "\n",
    "train_predprob = xgb_final.predict_proba(X_tr)\n",
    "logloss_train = log_loss(y_tr, train_predprob)\n",
    "\n",
    "val_predprob = xgb_final.predict_proba(X_val)\n",
    "logloss_val = log_loss(y_val, val_predprob)\n",
    "#Print model report:\n",
    "print(\"logloss of train :\",logloss_train )\n",
    "print(\"logloss of validation :\",logloss_val )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 接下来生成测试结果文件吧"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>virtual</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2950</td>\n",
       "      <td>1475.000000</td>\n",
       "      <td>1475.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>11</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>950.000000</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3758</td>\n",
       "      <td>1879.000000</td>\n",
       "      <td>1879.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>3300</td>\n",
       "      <td>1650.000000</td>\n",
       "      <td>1100.000000</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>11</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2.0</td>\n",
       "      <td>2</td>\n",
       "      <td>4900</td>\n",
       "      <td>1633.333333</td>\n",
       "      <td>1633.333333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 227 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.0         1   2950      1475.000000     1475.000000        0.0   \n",
       "1        1.0         2   2850      1425.000000      950.000000       -1.0   \n",
       "2        1.0         1   3758      1879.000000     1879.000000        0.0   \n",
       "3        1.0         2   3300      1650.000000     1100.000000       -1.0   \n",
       "4        2.0         2   4900      1633.333333     1633.333333        0.0   \n",
       "\n",
       "   room_num  Year  Month  Day  ...   virtual  walk  walls  war  washer  water  \\\n",
       "0       2.0  2016      6   11  ...         0     0      0    0       0      0   \n",
       "1       3.0  2016      6   24  ...         0     0      0    1       0      0   \n",
       "2       2.0  2016      6    3  ...         0     0      0    0       0      0   \n",
       "3       3.0  2016      6   11  ...         0     0      0    0       0      0   \n",
       "4       4.0  2016      4   12  ...         0     0      0    1       0      0   \n",
       "\n",
       "   wheelchair  wifi  windows  work  \n",
       "0           0     0        0     0  \n",
       "1           0     0        0     0  \n",
       "2           0     0        0     0  \n",
       "3           1     0        0     0  \n",
       "4           0     0        0     0  \n",
       "\n",
       "[5 rows x 227 columns]"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test = pd.read_csv(\"./data/RentListingInquries_FE_test.csv\")\n",
    "test.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以看到，这个数据集最后几个是空的。所以我们使用第二周的测试集来做"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 74659 entries, 0 to 74658\n",
      "Columns: 225 entries, listing_id to work\n",
      "dtypes: float64(7), int64(218)\n",
      "memory usage: 128.2 MB\n"
     ]
    }
   ],
   "source": [
    "test = pd.read_csv('./data/RentListingInquries_FE_test_new.csv')\n",
    "\n",
    "test.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(49352, 227)"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(74659, 227)"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [],
   "source": [
    "prediction = xgb_final.predict_proba(np.array(test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.08659083,  0.42025816,  0.49315107],\n",
       "       [ 0.31176218,  0.38607419,  0.30216363],\n",
       "       [ 0.0409453 ,  0.08585643,  0.87319827],\n",
       "       ..., \n",
       "       [ 0.04089605,  0.29325518,  0.66584873],\n",
       "       [ 0.36669064,  0.46678114,  0.16652818],\n",
       "       [ 0.04484471,  0.38521904,  0.56993628]], dtype=float32)"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "submission = pd.DataFrame(columns=['0','1','2'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "submission = prediction"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
